<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <script>
        /* 
            案例一:
                预解析:
                    var a;
                    alert(a)
                    a = 0
                结果:
                    undefined
        */
        // alert(a);
        // var a = 0;



        /* 
            案例二:
                要记得,预解析 就会解析 var 关键字声明的变量或者是赋值式函数和声明式函数  
        */
        // alert(a);
        // a = 0;//没有使用var,没有函数,他不会提升 a is not defined



        /* 
            案例三:
                预解析
                    var a;
                    alert(a)
                    a = 0;
                    alert(a)
                结果
                    undefined
                    0
        */
        // alert(a);
        // var a = 0;
        // alert(a);




        /* 
            案例四:
                预解析:
                    var a;
                    function a(){alert("我是函数")}
                    alert(a)
                    a = "我是变量"
                    alert(a)
                结果:
                    function a(){alert("我是函数")}
                    "我是变量"
        */
        // alert(a);
        // var a = '我是变量';
        // function a() { alert('我是函数') }
        // alert(a);


        /* 
            案例四1:
                预解析:
                    var a;
                    function a(){alert("我是函数")}
                    a();
                    a = "我是变量"
                    alert(a)
                结果:
                    function a(){alert("我是函数")}
                    "我是变量"
        */
        // a();
        // var a = '我是变量';
        // function a() { alert('我是函数') }
        // alert(a);


        /* 
            案例五:
                预解析:
                    var a;
                    function a(){alert("我是函数")}
                    alert(a)
                    a++
                    alert(a)
                    a = "我是变量"
                    alert(a)
                结果:
                    function a(){alert("我是函数")}
                    NaN
                    我是变量
        */
        // alert(a);
        // a++;
        // alert(a);
        // var a = '我是变量';
        // function a() {
        //     alert('我是函数')
        // }
        // alert(a)


        /* 
            案例六:
                预解析:
                    var a;
                    function fn(){
                        //函数内部也要提升
                            //预解析:
                                var a;
                                alert(a)
                                a = 1;
                                alert(a)
                        // alert(a)
                        // var a = 1;
                        // alert(a)
                    }
                    alert(a)
                    a = 0;
                    alert(a);
                    fn();
                    alert(a);
                结果:
                    undefined
                    0
                    undefined
                    1
                    0
        */
        // alert(a);
        // var a = 0;
        // alert(a);
        // function fn() {
        //     alert(a);
        //     var a = 1;
        //     alert(a);
        // }
        // fn()
        // alert(a);


        /* 
            案例七:
                预解析:
                    var fn;                                         //undefined
                    function fun(){console.log("我是fun函数");}     // 函数
                    fun();                                          //输出 我是fun函数
                    fn = function(){console.log("我是fn函数");}     
                    fn();                                           //输出 我是fn函数
                    fn = 100;
                    fn();   //有将这个数字当做一个函数进行调用 => fn is not a function
                结果:
        */
        // fun();
        // var fn = function () {
        //     console.log("我是fn函数");
        // }
        // function fun() {
        //     console.log("我是fun函数");
        // }
        // fn();
        // fn = 100;
        // fn();



        /* 
            案例八:
                预解析:
                // 当变量提升与函数提升的名字重复时候,变量的提升被忽略
                    function fn(){console.log("我是一个fn函数");}
                    // var fn;
                    fn();
                    fn();
                    fn = 100;
                    fn();
                结果:
                    我是一个fn函数
                    我是一个fn函数
                    fn is not funtion
        */

        // fn();
        // function fn() {
        //     console.log("我是一个fn函数");
        // }
        // fn();
        // var fn = 100;
        // fn();



        /* 
            案例九:
                报错 => b is not a defined
        */
        // var a = b;
        // a = 0;
        // b = 0;
        // console.log(a);
        // console.log(b);


        /* 
            案例十:
                预解析:
                    var fun;
                    var fun;
                    fun = 200;
                    fun();
                    fun = function(){console.log("我是一个fun函数");}
                    fun();
                结果:
                    fun is not a funtion
        */
        // var fun = 200;
        // fun();
        // var fun = function () {
        //     console.log("我是一个fun函数");
        // }
        // fun();


        /* 
            案例十一
                预解析:
                    var fun;
                    var fun;
                    fun = 200;
                    fun = function(){console.log("我是一个fun函数");}
                    fun();
                结果:
                    console.log("我是一个fun函数");
        */
        // var fun = 200;
        // var fun = function () {
        //     console.log("我是一个fun函数");
        // }
        // fun();


        /* 
            案例十二:
                预解析:
                    var fun;
                    function fun(){("我是一个fun函数");}
                    fun = 200;
                    fun()
                结果:
                    fun is not a funtion

        */
        // var fun = 200;
        // function fun() {
        //     console.log("我是一个fun函数");
        // }
        // fun();


        /* 
            案例十三
                预解析:
                    var num;
                    console.log(num);
                    if(fales){
                        num = 20
                    }
                结果:
                    undefined

        */
        // console.log(num);
        // if (false) {
        //     var num = 20;
        // }


        /* 
            案例十四:
                预解析:
                    function fn(){
                        var num ;
                        console.log(num);
                        return;
                        num = 20;
                    }
                    fn();
                结果:
                    undefined
        */
        // function fn() {
        //     console.log(num);
        //     return;
        //     var num = 10;
        // }
        // fn();

    </script>
</body>

</html>